package com.sudoctor.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.TreeSet;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.sudoctor.bean.DatosBusquedaBean;
import com.sudoctor.bean.Pagina;

public class PaginacionTagHandler extends TagSupport
{

	private static final long serialVersionUID = 4532878995834697187L;
	
	@SuppressWarnings("rawtypes")
	private static class Link implements Comparable {

        private String text;
        private int page;

        public Link(int page, int lastPage, String text) {
            this.page = Math.max(Math.min(page, lastPage), 1);
            this.text = text;
        }

        public Link(int page, int lastPage) {
            this.page = Math.max(Math.min(page, lastPage), 1);
            this.text = String.valueOf(page);
        }

        public String getLinkText(int currentPage, String prefix, String tipoServicio, String lugar, String especialidad, String descripcion, String  baseUrl) {
            
        	String url = "";
        	int existe = baseUrl.indexOf("siguiente");
        	
        	if(existe == -1){
        		url = "<a class=\"page gradient\" href=\"" + prefix + "page" + "=" + page + "&descripcion="+descripcion+"\">" + text + "</a>";
        	}else{
        		url = "<a class=\"page gradient\" href=\"" + "siguiente/"+tipoServicio+"/"+lugar+"/"+especialidad+".html" + prefix + "page" + "=" + page + "&descripcion="+descripcion+"\">" + text + "</a>";
        	}
        	
        	if (currentPage != page) {
                // Solo pintamos enlace cuando no es la página  actual
            		return url;
            } else {
                // Si es la página  actual, solo pintamos el texto
                return ("<span class=\"page active\">" + page + "</span>");
            }
        }

        /**
         * Metodo para que los Link repetidos se eliminen del TreeSet, ya que el metodo
         * equals por defecto que hereda de java.lang.Object, compara los hashCode.
         * @return
         */
        public int hashCode() {
            return page;
        }
        /**
         * Metodo que mantiene los Link ordenados en el TreeSet
         * @param o
         * @return
         */
        public int compareTo(Object o) {
            int thisVal = this.page;
            int anotherVal = ((Link) o).page;
            return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
        }
    }

    private String attribute;
    private String baseUrl;
    private String tipoServicio;
    private String lugar;
    private String especialidad;
    private String descripcion;

    public String getAttribute() { return attribute; }

    public void setAttribute(String attribute) { this.attribute = attribute; }

    public String getBaseUrl() { return baseUrl; }

    public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; }


    public int doEndTag()
        throws JspException {
        try {
            JspWriter w = pageContext.getOut();

            //Pagina search = (Pagina) pageContext.getRequest().getAttribute(attribute);
            Pagina search = ((DatosBusquedaBean)pageContext.getRequest().getAttribute(attribute)).getObjPagina();

            // En funcion si la url ya tiene parametros "/servlet?parametro1=a" o
            // no los tiene "/servlet", concatenamos un "?" o un "&".
            // Recordemos que en las url, el prefijo "?" sirve para el primero parametro y
            // que los siguientes parametros necesitan el prefijo "&"
            //String prefix = baseUrl.indexOf("?") > -1 ? "&" : "?";
            String prefix = "?";
            int lastPage = search.getLastPage();
            int page = search.getPage();


            // No cambiar el orden de insercion, ya que define la prioridad en caso
            // de páginas repetidas. Por ejemplo, si la página  actual y la ultima
            // coinciden, entonces tiene prioridad la página  actual. Y asi con el
            // resto.
            TreeSet al = new TreeSet();
            
            al.add(new Link(page, lastPage));
            
            al.add(new Link(page - 1, lastPage));
            
            al.add(new Link(page - 2, lastPage));
            
            al.add(new Link(page - 3, lastPage));
           
            al.add(new Link(page - 4, lastPage));
           
            al.add(new Link(page - 5, lastPage));
            
            if(page > 6 )
            {
            	al.add(new Link(page + 1, lastPage));
                al.add(new Link(page + 2, lastPage));
                al.add(new Link(page + 3, lastPage));
                al.add(new Link(page + 4, lastPage));
                //al.add(new Link(page + 5, lastPage));
            }else{
            	al.add(new Link(2, lastPage));
            	al.add(new Link(3, lastPage));
            	al.add(new Link(4, lastPage));
            	al.add(new Link(5, lastPage));
            	al.add(new Link(6, lastPage));
                al.add(new Link(7, lastPage));
                al.add(new Link(8, lastPage));
                al.add(new Link(9, lastPage));
                al.add(new Link(10, lastPage));
            }
            
            //al.add(new Link(page + 1, lastPage, "Anterior"));
            //al.add(new Link(page - 1, lastPage, "Siguiente"));

            int j = 1;
            for (Iterator i = al.iterator(); i.hasNext();j++) {
                Link l = (Link)i.next();
                if(j == 1 && page > 1)
                {
                	//Anterior
                	w.print("<a class=\"page gradient\" href=\"" + prefix + "page" + "=" + (page-1) + "&descripcion="+descripcion+"\">" + "Anterior" + "</a>");
                }
                
                //Todos los numero de pagina
                w.print(l.getLinkText(page, prefix,tipoServicio,lugar,especialidad,descripcion,baseUrl));
                
                if(al.size() > 1 && al.size() == j)
                {
                	//Siguiente
               	
                	int existe = baseUrl.indexOf("siguiente");
                	
                	if(existe == -1){
                		w.print("<a class=\"page gradient\" href=\"" + prefix + "page" + "=" + (page+1) + "&descripcion="+descripcion+"\">" + "Siguiente" + "</a>");
                	}else{
                		w.print("<a class=\"page gradient\" href=\"" + "siguiente/"+tipoServicio+"/"+lugar+"/"+especialidad+".html" + prefix + "page" + "=" + (page+1) + "&descripcion="+descripcion+"\">" + "Siguiente" + "</a>");
                	}
             	
                }
                
            }
            return EVAL_PAGE;
        } catch (IOException ioe) {
            throw new JspException(ioe.getMessage());
        }
    }

	public String getTipoServicio()
	{
		return tipoServicio;
	}

	public void setTipoServicio(String tipoServicio)
	{
		this.tipoServicio = tipoServicio;
	}

	public String getLugar()
	{
		return lugar;
	}

	public void setLugar(String lugar)
	{
		this.lugar = lugar;
	}

	public String getEspecialidad()
	{
		return especialidad;
	}

	public void setEspecialidad(String especialidad)
	{
		this.especialidad = especialidad;
	}

	public String getDescripcion()
	{
		return descripcion;
	}

	public void setDescripcion(String descripcion)
	{
		this.descripcion = descripcion;
	}

}
